package com.gegong.vmware.workstation.utils;

import java.util.Random;


/**
 * <p>
 * 生成随机 Mac 地址
 * 这段时间做项目，涉及到虚拟机 Mac 地址生成，网上找了一些 Java 随机生成 Mac 地址的代码，大多都是从 {‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘e’, ‘d’, ‘f’} 随机取一位拼成 Mac 地址字符串，实际上这种方式不符合 Mac 地址定义，下面将给出我随机生成 Mac 地址的方法，该方法参考相关 python 代码片段
 * <p>
 * 什么是 Mac 地址
 * MAC（Media Access Control）地址，称为物理地址、硬件地址。每块网卡有唯一的 Mac 地址。
 * 通常 Mac 地址是固定的。
 * <p>
 * Mac 地址采用 16 进制数表示，一个 2 位 16 进制数为 1byte，共 6byte（48bit）。
 * Mac 地址的前 3byte 由 IEEE 的注册管理机构 RA 负责给不同厂家分配，被称为 OUI（Organizationally Unique Identifier），中文译作组织唯一的标识符。后 3byte 由各厂家自行指派（本文为算法随机生成），称为扩展标识符。
 * <p>
 * 从上面 Mac 地址的构成分析可得出，当 OUI 固定后，共有 224=16777216224=16777216 个不同的地址。
 * <p>
 * Mac 地址生成原理
 * 前面分析了 Mac 地址由 6 个 2 位 16 进制数组成，如 52:54:00:a3:07:18。该地址的前 3 位 52:54:00 由 OUI 分配给 qemu/kvm，我们只需随机生成后 3 位。
 * <p>
 * 我们知道的是一个 2 位 16 进制数铁定是 0x00-0xff 中的一位，那么问题就简单了，我们使用 Java 中的随机数类 Random 的方法 nextInt(int bound) 在 0x00-0xff 范围内随机取一个整数就行了。
 * <p>
 * 0x00-0xff 如果用 10 进制数表示则是 0-255 ,因此 在 0-255 范围内随机取一个整数和 0x00-0xff 效果是一样的。
 * ---------------------
 * 作者：kyyee
 * 来源：CSDN
 * 原文：https://blog.csdn.net/kyyee/article/details/72873148
 * 版权声明：本文为博主原创文章，转载请附上博文链接！
 *
 * </p>
 */
public class VMMacAddressUtils {


    /**
     * Generate a random MAC address for qemu/kvm
     * 52-54-00 used by qemu/kvm
     * The remaining 3 fields are random,  range from 0 to 255
     *
     * @return MAC address string
     */
    public static String random(String separator) {
        Random random = new Random();
        String[] mac = {
                String.format("%02x", 0x00),
                String.format("%02x", 0x50),
                String.format("%02x", 0x56),
                String.format("%02x", random.nextInt(0xff)).toUpperCase(),
                String.format("%02x", random.nextInt(0xff)).toUpperCase(),
                String.format("%02x", random.nextInt(0xff)).toUpperCase()
        };
        return String.join(separator, mac);
    }


    public static String random() {

        return random("");
    }
}
